Skip to content

perf: improve perf with more delegation - #1090

Open
avivkeller wants to merge 1 commit into
mainfrom
perf-improvements-1234
Open

perf: improve perf with more delegation#1090
avivkeller wants to merge 1 commit into
mainfrom
perf-improvements-1234

Conversation

@avivkeller

Copy link
Copy Markdown
Member

Fixes #1008

Various performance improvements

@avivkeller
avivkeller requested a review from a team as a code owner September 6, 2026 02:12
@cloudflare-workers-and-pages

Copy link
Copy Markdown

🚀 Deploying Preview to Cloudflare 🚀

Preview Deployments by commit

Status Deployment URL Commit Updated (UTC) See this deployment's details
  • Build: Failed ❌

View logs ↗
2de8cdb 2026-09-06T02:12:54.801Z View logs ↗

@vercel

vercel Bot commented Sep 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
api-docs-tooling Ready Ready Preview Sep 6, 2026 2:13am UTC

Request Review

...imports,
`export const headings = ${JSON.stringify(headings)};`,
`export const content = () => ${content};`,
`export default () => renderToStringAsync(<${JSX_IMPORTS.Layout.name} metadata={${JSON.stringify(metadata)}} headings={headings} readingTime={${JSON.stringify(readingTime?.text)}}>{content()}</${JSX_IMPORTS.Layout.name}>);`,
...imports,
`export const headings = ${JSON.stringify(headings)};`,
`export const content = () => ${content};`,
`export default () => renderToStringAsync(<${JSX_IMPORTS.Layout.name} metadata={${JSON.stringify(metadata)}} headings={headings} readingTime={${JSON.stringify(readingTime?.text)}}>{content()}</${JSX_IMPORTS.Layout.name}>);`,
@codecov

codecov Bot commented Sep 6, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.01136% with 21 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.68%. Comparing base (307fdc9) to head (2de8cdb).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
packages/react/src/html/bundlers/vite.mjs 95.17% 7 Missing ⚠️
packages/react/src/jsx-ast/utils/buildContent.mjs 88.09% 5 Missing ⚠️
packages/react/src/html/utils/generate.mjs 98.03% 2 Missing ⚠️
packages/core/src/utils/configuration/index.mjs 88.88% 1 Missing ⚠️
...es/core/src/utils/type-annotations/highlighted.mjs 98.43% 1 Missing ⚠️
packages/react/src/html/utils/processing.mjs 98.24% 1 Missing ⚠️
packages/react/src/html/utils/render.mjs 98.80% 1 Missing ⚠️
packages/react/src/jsx-ast/generate.mjs 92.85% 1 Missing ⚠️
...es/react/src/jsx-ast/utils/plugins/transformer.mjs 91.66% 1 Missing ⚠️
packages/react/src/jsx-ast/utils/remark.mjs 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1090      +/-   ##
==========================================
+ Coverage   90.60%   90.68%   +0.08%     
==========================================
  Files         217      219       +2     
  Lines       20802    21127     +325     
  Branches     1974     1999      +25     
==========================================
+ Hits        18847    19159     +312     
- Misses       1948     1961      +13     
  Partials        7        7              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

api-links Generator

Performance estimate (single CI run)

  • Generation time: 31.4% slower (1.02 s → 1.34 s)
  • Peak memory: 2.7% lower (359.77 MB → 350.08 MB)

legacy-html Generator

Performance estimate (single CI run)

  • Generation time: 10.2% faster (35.62 s → 31.99 s)
  • Peak memory: 11.4% lower (2.55 GB → 2.26 GB)

legacy-json Generator

Performance estimate (single CI run)

  • Generation time: 61.5% faster (21.72 s → 8.36 s)
  • Peak memory: 24.2% lower (2.05 GB → 1.55 GB)

llms-txt Generator

Performance estimate (single CI run)

  • Generation time: 70.4% faster (21.63 s → 6.40 s)
  • Peak memory: 0.3% higher (1.80 GB → 1.81 GB)

orama-db Generator

Output size: 1 file changed · net +111.00 B

File size details
File Main PR Change
orama-db.json 9.36 MB 9.36 MB +111.00 B (+0.0%)

Performance estimate (single CI run)

  • Generation time: 72.1% faster (20.69 s → 5.77 s)
  • Peak memory: 21.1% lower (2.04 GB → 1.61 GB)

web Generator

Output size: 2 files changed · net -49.00 B

File size details
File Main PR Change
all.html 32.46 MB 32.46 MB -47.00 B (-0.0%)
404.html 21.90 KB 21.90 KB -2.00 B (-0.0%)

Performance estimate (single CI run)

  • Generation time: 68.0% faster (130.11 s → 41.64 s)
  • Peak memory: 28.0% lower (5.50 GB → 3.96 GB)

@ovflowd

ovflowd commented Sep 6, 2026

Copy link
Copy Markdown
Member

Various performance improvements

Could you expand what these "various performance improvements" are? The PR descriptions should clearly state what the PR does.

const configExplorer = cosmiconfig('doc-kit');

// The default `threads` ceiling; `--threads` raises it explicitly.
const MAX_THREADS = 4;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: That should be in a constant file

* every module a second time here.
*/
const buildSyntheticDescriptors = input => {
const buildSyntheticDescriptors = () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This name.... doesn't mean much, now this could just be buildNotFoundPage imo

@ovflowd

ovflowd commented Sep 6, 2026

Copy link
Copy Markdown
Member

@nodejs/platform-riscv64 could you maybe break down this PR after looking at it for a while it feels that it is doing several things at the same time, which makes it harder to understand what is what (ie: what is being changed for performance improv and which piece of that, what is just refactoring) [...] imo even just the piece of threading tuning should be its own PR.

Reviewing such large PRs is hard and reduces my ability (and of others) to properly review this PR.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These changes seem pretty good, any benchmarks/numbers on the gains here?

// Vite writes the compiled SSR renderers here so Node can import and execute
// them without mixing intermediate modules into the final site. The directory
// is removed after rendering
const temporaryDirectory = await createTemporaryDirectory();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need more for a temporary dir or is that now managed somewhere else?

sources.set(id, html);
}
const sources = new Map([
[

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is this import module? Is this to allow HMR?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this always be bundled with the server?

})
);

const requested = vite.build?.manifest;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ooc, why the name of this variable is requested, is there a reason? just trying to understand if the name is intentional :P

return {
scripts: [chunk.file],
preloads: collectImports(manifest, chunk),
// With CSS code splitting off, the one stylesheet is its own manifest

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure I understand, could you rephrase for clarity?

const byApi = new Map(pages.map(page => [page.data.api, page]));

const parts = getSortedHeadNodes(
pages

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you assign this to its own const, making this line simpler?

.filter(data => !data.synthetic && !data.chunk && data.api !== 'index')
).map(({ api }) => byApi.get(api));

const minutes = parts.reduce(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd argue we shouldn't have a reading minutes on our API docs, only on Learn/Blog content. Nor should we have it on all.html

...imports,
`export const headings = ${JSON.stringify(headings)};`,
`export const content = () => ${content};`,
`export default () => renderToStringAsync(<${JSX_IMPORTS.Layout.name} metadata={${JSON.stringify(metadata)}} headings={headings} readingTime={${JSON.stringify(readingTime?.text)}}>{content()}</${JSX_IMPORTS.Layout.name}>);`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, I'd aruge sanitization would be good here

* @returns {string}
*/
export const buildAssetTags = ({ scripts, preloads, stylesheets }, root) =>
[

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this not be a multi level spread? Also is string manipulation the best way of doing this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make all.html a concatenation of existing pages

3 participants